﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TVL;
using System.Xml;
using General;

namespace TVLL5A
{
    public class PersonajeL5A : NPCL5A
    {
        private string _Jugador;
        private int _Experiencia;
        private List<Ventajas> _VyDV;
        private const string _rutaxsd = "../../../TVLL5A/PersonajeL5A.xsd";

        public PersonajeL5A()
        {
            _Jugador = "";
            _Experiencia = 0;
            _VyDV = new List<Ventajas>();
        }

        public PersonajeL5A(string ruta)
        {
            _VyDV = new List<Ventajas>();
            this.cargar(ruta);
        }

        public PersonajeL5A(XmlElement nodo)
        {
            _VyDV = new List<Ventajas>();
            this.cargar(nodo);
        }

        public string Jugador
        {
            get
            {
                return this._Jugador;
            }
            set
            {
                this._Jugador = value;
            }
        }

        public int Experiencia
        {
            get
            {
                return this._Experiencia;
            }
            set
            {
                this._Experiencia = value;
            }
        }

        public List<Ventajas> VyDV
        {
            get
            {
                return this._VyDV;
            }
            set
            {
                this._VyDV = value;
            }
        }

        public override void toXTVL(XmlTextWriter mixml)
        {
            mixml.WriteStartElement("personaje");
            mixml.WriteAttributeString("juego", "L5A");
            mixml.WriteAttributeString("jugador", this.Jugador);
            mixml.WriteAttributeString("tipo", "Jugador");
            mixml.WriteElementString("nombre", this.Nombre);
            mixml.WriteElementString("bio", this.Bio);
            mixml.WriteElementString("status", this.Status);
            mixml.WriteElementString("exp", this.Experiencia.ToString());
            mixml.WriteStartElement("ventajas");
            for (int i = 0; i < VyDV.Count; i++)
            {
                this.VyDV[i].toXTVL(mixml);
            }
            mixml.WriteEndElement();
            mixml.WriteElementString("clan", this.Clan);
            mixml.WriteStartElement("atributos");
            mixml.WriteElementString("resistencia", this.Resistencia.ToString());
            mixml.WriteElementString("voluntad", this.Voluntad.ToString());
            mixml.WriteElementString("fuerza", this.Fuerza.ToString());
            mixml.WriteElementString("percepcion", this.Percepcion.ToString());
            mixml.WriteElementString("agilidad", this.Agilidad.ToString());
            mixml.WriteElementString("inteligencia", this.Inteligencia.ToString());
            mixml.WriteElementString("reflejos", this.Reflejos.ToString());
            mixml.WriteElementString("consciencia", this.Consciencia.ToString());
            mixml.WriteElementString("vacio", this.Vacio.ToString());
            mixml.WriteEndElement();
            mixml.WriteStartElement("habilidades");
            for (int i = 0; i < this.Habilidades.Count; i++)
            {
                this.Habilidades[i].toXTVL(mixml);
            }
            mixml.WriteEndElement();
            mixml.WriteStartElement("hechizos");
            for (int i = 0; i < this.Hechizos.Count; i++)
            {
                this.Hechizos[i].toXTVL(mixml);
            }
            mixml.WriteEndElement();
            mixml.WriteElementString("daño_actual", this.DañoActual.ToString());
            mixml.WriteElementString("honor", this.Honor.ToString());
            mixml.WriteElementString("gloria", this.Gloria.ToString());
            mixml.WriteElementString("mancha_sombria", this.ManchaSombria.ToString());
            this.Inventario.toXTVL(mixml);
            mixml.WriteEndElement();
            
        }

        public override bool guardar(string ruta)
        {
            XmlTextWriter mixml = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            mixml.Formatting = System.Xml.Formatting.Indented;
            mixml.WriteStartDocument();
            this.toXTVL(mixml);
            mixml.WriteEndDocument();
            mixml.Close();
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (validador.validar())
            {
                this._fallo = validador.Fallo;
                return true;
            }
            else
            {
                if (System.IO.File.Exists(ruta))
                {
                    System.IO.File.Delete(ruta);
                }
                return false;
            }
        }

        public override bool cargar(string ruta)
        {
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (!validador.validar())
            {
                this._fallo = validador.Fallo;
                return false;
            }
            else
            {
                XmlDocument xtvl = new XmlDocument();
                xtvl.Load(ruta);
                XmlNodeList exp = xtvl.GetElementsByTagName("exp");
                XmlNodeList jug = xtvl.GetElementsByTagName("personaje");
                XmlNodeList vent = xtvl.GetElementsByTagName("ventajas");

                this.Experiencia = Convert.ToInt32(exp[0].InnerText);

                foreach (XmlElement njug in jug)
                {
                    this.Jugador = njug.GetAttribute("jugador");
                }

                foreach (XmlElement vents in vent)
                {
                    Ventajas v = new Ventajas(vents);
                    this.VyDV.Add(v);
                }
                return base.cargar(ruta);
            }

        }

        public override bool cargar(XmlElement nodo)
        {
            try
            {
                XmlNodeList exp = nodo.GetElementsByTagName("exp");
                XmlNodeList jug = nodo.GetElementsByTagName("personaje");
                XmlNodeList vent = nodo.GetElementsByTagName("ventajas");

                this.Experiencia = Convert.ToInt32(exp[0].InnerText);

                this.Jugador = nodo.GetAttribute("jugador");
                foreach (XmlElement vents in vent)
                {
                    Ventajas v = new Ventajas(vents);
                    this.VyDV.Add(v);
                }
                return base.cargar(nodo);
            }
            catch (Exception ex)
            {
                this._fallo = ex.Message;
                return false;
            }
        }
    }
}
